package HelloSeries.strategies.search;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;

import HelloSeries.conf.Configuration;
import HelloSeries.metier.Serie;
import HelloSeries.strategies.TorrentSearch;

public class ExtraTorrentSearch extends TorrentSearch{

    private final String baseURL = 

    private static Logger logger = Logger.getLogger( ExtraTorrentSearch.class );

    public synchronized ArrayList<Serie> executeSearch( Serie serie )
    {
        try
        {
            boolean nextsaison = true;
            boolean findInSeason = true;
            Serie currentSerie = new Serie();
            currentSerie.copy( serie );
            currentSerie.incEpisode();

            logger.warn( "Recherche de " + currentSerie.toString() );
            
            while ( nextsaison )
            {
                findInSeason = true;
                nextsaison = false;
                // While : une episode est trouv� dans la saison, sort quand l'�pisode n'est pas trouv�
                while ( findInSeason )
                {
                    findInSeason = false;
                    String nom_url = getUrlRecherche( currentSerie );
                    logger.info( "Url de recherche : " + nom_url );
                    URL url = new URL( nom_url );
                    Document document = createSAXBuilder().build( url );
                    // R�cup�ration des donn�es
                    List<Element> items = document.getRootElement().getChild( "channel" ).getChildren( "item" );
                    // Cr�ation s�rie temporaire
                    Serie serieTMP = new Serie();

                    if ( !items.isEmpty() )
                    {
                        // Recherche dans les r�sultats
                        for ( Iterator<Element> iterator2 = items.iterator(); iterator2.hasNext(); )
                        {
                            Element e = (Element) iterator2.next();
                            Serie s = new Serie( getTitre( e ) );

                            if ( currentSerie.equals( s ) )
                            {
                                // R�cup�ration de l'url
                                s.setUrl( getUrl( e ) );

                                // R�cup�ration de la description
                                int seeds = getSeeds( e );

                                // R�cup�ration de la taille
                                double taille = getTaille( e );

                                if ( taille > Configuration.getInstance().getSizemin() && taille < Configuration.getInstance().getSizemax() && seeds >= Configuration.getInstance().getSeedsmin() )
                                {
                                    s.setSeeds( seeds );
                                    // R�cup�ration du fichier qui a le plus de seeds
                                    if ( serieTMP.getSeeds() < s.getSeeds() )
                                    {
                                        serieTMP.copy( s );
                                    }
                                    findInSeason = true;
                                    nextsaison = true;
                                }
                            }
                        }
                    }
                    else
                    {
                        findInSeason = false;
                    }

                    // Si on a trouv� une s�rie on l'ajoute aux nouvelles
                    if ( findInSeason )
                    {
                        liste_new_series.add( serieTMP );
                    }
                    currentSerie.setEpisode( currentSerie.getEpisode() + 1 );
                }
                // On v�rifie si il y a une saison suppl�mentaire
                currentSerie.newSaison();
            }
        }
        catch ( MalformedURLException e )
        {
            logger.error( " MalformedURLException : " + e.getMessage() );
        }
        catch ( IOException e )
        {
            logger.error( " IOException : " + e.getMessage() );
            e.printStackTrace();
        }
        catch ( JDOMException e )
        {
            logger.error( " JDOMException : " + e.getMessage() );
        }
        logger.warn( liste_new_series.size() + " �pisode(s) trouv�(s)" );
        return liste_new_series;
    }


    protected double getTaille( Element e )
    {
        double size = Double.parseDouble( e.getChild( "enclosure" ).getAttributeValue( "length" ) ) / 1000000;
        // logger.debug( "Size =" + size );
        return size;
    }

    protected int getSeeds( Element e )
    {
        int seeds = 0;
        try
        {
            seeds = Integer.parseInt( e.getChild( "seeders" ).getValue() );
        }
        catch ( Exception ex )
        {
            logger.debug( "Impossible de trouver les Seeds : " + ex.getMessage() );
        }
        // logger.debug( "Seeds =" + seeds );
        return seeds;
    }

    protected String getTitre( Element e )
    {
        String titre = e.getChildText( "title" );
        return titre;
    }

    protected String getUrl( Element e )
    {
        String url = e.getChild( "enclosure" ).getAttributeValue( "url" ).replace( "&amp;", "&" );
        return url;
    }

    @Override
    protected String getUrlRecherche( Serie serie )
    {
        String url = baseURL;

        return url + ( serie.toString() + serie.isHD() ).trim().replaceAll( " ", "+" );
    }

}
